package com.weijian.common.pojo;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollectionUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Collections;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class PageResponse<T> {

    /**
     * 总条数
     */
    private Long total;

    /**
     * 总页数
     */
    private Long pages;

    /**
     * 数据集合
     */
    private List<T> list;

    /**
     * 返回空分页结果
     *
     * @param page MybatisPlus的分页结果
     * @param <T>  目标VO类型
     * @param <P>  原始PO类型
     * @return 自定义VO的分页结果
     */
    public static <T, P> PageResponse<T> empty(Page<P> page) {
        return new PageResponse<>(page.getTotal(), page.getPages(), Collections.emptyList());
    }

    /**
     * 将MybatisPlus分页结果转化为VO分页
     *
     * @param page      MybatisPlus的分页结果
     * @param voClass   目标VO类型的字节码
     * @param <T>目标VO类型
     * @param <P>原始PO类型
     * @return 自定义VO的分页结果
     */
    public static <T, P> PageResponse<T> of(Page<P> page, Class<T> voClass) {
        //1、非空校验
        List<P> records = page.getRecords();
        if (CollectionUtil.isEmpty(records)) {
            return empty(page);
        }
        //2、数据校验
        List<T> vos = BeanUtil.copyToList(records, voClass);
        //3、封装返回
        return new PageResponse<>(page.getTotal(), page.getPages(), vos);
    }

    /**
     * 将MybatisPlus分页结果转为 VO分页结果，允许用户自定义PO到VO的转换方式
     *
     * @param page      MybatisPlus的分页结果
     * @param convertor PO转VO的转换函数
     * @param <T>目标VO类型
     * @param <P>原始PO类型
     * @return 自定义VO的分页结果
     */
    public static <T, P> PageResponse<T> of(Page<P> page, Function<P, T> convertor) {
        //1、非空校验
        List<P> records = page.getRecords();
        if (CollectionUtil.isEmpty(records)) {
            return empty(page);
        }
        //2、数据转换
        List<T> vos = records.stream().map(convertor).collect(Collectors.toList());
        //3、封装返回
        return new PageResponse<>(page.getTotal(), page.getPages(), vos);
    }
}